let root = try!(find_root_manifest_for_cwd(options.flag_manifest_path));
let mut doc_opts = ops::DocOptions {
- all: !options.flag_no_deps,
open_result: options.flag_open,
compile_opts: ops::CompileOptions {
config: config,
exec_engine: None,
filter: ops::CompileFilter::Everything,
release: false,
- mode: ops::CompileMode::Build,
+ mode: ops::CompileMode::Doc {
+ deps: !options.flag_no_deps,
+ },
},
};
Test,
Build,
Bench,
+ Doc { deps: bool },
}
pub enum CompileFilter<'a> {
let mut build_config = try!(scrape_build_config(config, jobs, target));
build_config.exec_engine = exec_engine.clone();
build_config.release = release;
+ if let CompileMode::Doc { deps } = mode {
+ build_config.doc_all = deps;
+ }
try!(ops::compile_targets(&targets, to_build,
&PackageSet::new(&packages),
CompileMode::Test => test,
CompileMode::Bench => &profiles.bench,
CompileMode::Build => build,
+ CompileMode::Doc { .. } => &profiles.doc,
};
return match *filter {
CompileFilter::Everything => {
t.is_bin() || t.is_lib()
}).map(|t| (t, profile)).collect())
}
+ CompileMode::Doc { .. } => {
+ Ok(pkg.targets().iter().filter(|t| t.documented())
+ .map(|t| (t, profile)).collect())
+ }
}
}
CompileFilter::Only { lib, bins, examples, tests, benches } => {
pub exec_engine: Arc<Box<ExecEngine>>,
pub fingerprints: HashMap<(&'a PackageId, &'a Target, &'a Profile, Kind),
Fingerprint>,
- pub initialized: HashSet<&'a PackageId>,
pub compiled: HashSet<(&'a PackageId, &'a Target, &'a Profile)>,
pub build_config: BuildConfig,
fingerprints: HashMap::new(),
profiles: profiles,
compiled: HashSet::new(),
- initialized: HashSet::new(),
})
}
pub fn dep_targets(&self, pkg: &Package, target: &Target,
profile: &Profile)
-> Vec<(&'a Package, &'a Target, &'a Profile)> {
+ if profile.doc {
+ return self.doc_deps(pkg);
+ }
let deps = match self.resolve.deps(pkg.package_id()) {
None => return Vec::new(),
Some(deps) => deps,
return ret
}
+ /// Returns the dependencies necessary to document a package
+ fn doc_deps(&self, pkg: &Package)
+ -> Vec<(&'a Package, &'a Target, &'a Profile)> {
+ let deps = self.resolve.deps(pkg.package_id()).into_iter();
+ let deps = deps.flat_map(|a| a).map(|id| {
+ self.get_package(id)
+ }).filter(|dep| {
+ pkg.dependencies().iter().find(|d| {
+ d.name() == dep.name()
+ }).unwrap().is_transitive()
+ }).filter_map(|dep| {
+ dep.targets().iter().find(|t| t.is_lib()).map(|t| (dep, t))
+ });
+
+ // To document a library, we depend on dependencies actually being
+ // built. If we're documenting *all* libraries, then we also depend on
+ // the documentation of the library being built.
+ let mut ret = Vec::new();
+ for (dep, lib) in deps {
+ ret.push((dep, lib, self.lib_profile(dep.package_id())));
+ if self.build_config.doc_all {
+ ret.push((dep, lib, &self.profiles.doc));
+ }
+ }
+
+ // Be sure to build/run the build script for documented libraries as
+ // well
+ let pkg = self.get_package(pkg.package_id());
+ if let Some(t) = pkg.targets().iter().find(|t| t.is_custom_build()) {
+ ret.push((pkg, t, self.build_script_profile(pkg.package_id())));
+ }
+ return ret
+ }
+
/// Gets a package for the given package id.
pub fn get_package(&self, id: &PackageId) -> &'a Package {
self.package_set.iter()